package com.btb.adapter.model;

import java.math.BigDecimal;
import java.util.Date;
import java.util.Objects;
import java.util.Optional;

import com.btb.adapter.vo.request.UpChainQuery;

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

/**
 *
 */
@Builder
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@Data
@ToString
public class UpChainFish {
    private Long id;

    /**
     * 拥有者地址
     */
    private String owner;

    /**
     * 请求的批次ID
     */
    private String requestId;

    /**
     * 唯一id自增序列是，通常是数据库主键
     */
    private Integer clientId;

    /**
     * 数字表示的赛季
1表示第一赛季
2表示第二赛季

     */
    private String season;

    /**
     * 唯一编号
     */
    private String sn;

    /**
     * 种族
1 恶魔
2 光明
3 可爱
4 黑暗
5 幻想
6 智慧
7 狡猾

     */
    private Integer race;

    /**
     * 鱼产生时的毫秒数
     */
    private Long productionDate;

    /**
     * 鱼简介
     */
    private String cardTips;

    /**
     * 卡牌形象url全路径
     */
    private String cardImage;

    /**
     * 1鱼2蛋
     */
    private Integer type;

    /**
     * 交易次数
     */
    private Long transactionNum;

    /**
     * 0未上链1上链中2上链待确认3上链成功4上链失败
     */
    private String status;

    /**
     * 上链如有错误时的描述
     */
    private String errDesc;

    /**
     * 上链操作transaction_hash
     */
    private String transactionHash;

    /**
     * 收到数据的时间戳 毫秒
     */
    private Long receiveTimestamp;

    /**
     * 开始上链的时间戳 毫秒
     */
    private Long startUpChainTimestamp;

    /**
     * 链上事件监听时间戳 毫秒
     */
    private Long eventUpChainTimestamp;

    /**
     * 收到事件时的区块高度
     */
    private Long blockNumber;

    /**
     * 上链操作使用的帐户
     */
    private String address;

    /**
     * 上链的gas费用
     */
    private BigDecimal gasUsed;

    /**
     * 推送检查结果
     */
    private String notifyCheckResult;

    /**
     * 调用远程确认时间
     */
    private Date notifyTime;

    /**
     * 已推送次数
     */
    private Integer notifyNum;

    /**
     * 调用远程确认时的区块高度
     */
    private Long notifyBlockNumber;

    /**
     * 通知结果
     */
    private String notityStatus;

    /**
     * 推送结果  如果不是成功,加下notify_num小于配置的次数,就一直推,
     */
    private String notifyResult;

    /**
     * 调用远程时的响应
     */
    private String notifyResponse;

    /**
     * 调用远程时携带的参数
     */
    private String notifyParam;

    /**
     * 响应唯一id
     */
    private String notifyRid;

    /**
     * 交易的唯一id由中心化定义，链上通知需要带上
     */
    private String transactionUuid;

    /**
     * 数据创建时间
     */
    private Date createTime;

    /**
     * 修改时间
     */
    private Date updatedTime;

   	public UpChainQuery build() {
		String gasUsedNew = Optional.ofNullable(gasUsed).filter(Objects::nonNull)
				.map(x -> x.stripTrailingZeros().toPlainString()).orElse(null);
		return UpChainQuery.builder().id(clientId).sn(sn).status(status).transactionHash(transactionHash)
				.receiveTimestamp(receiveTimestamp).startUpChainTimestamp(startUpChainTimestamp)
				.eventUpChainTimestamp(eventUpChainTimestamp).address(address).gasUsed(gasUsedNew).build();
	}
}